/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ppsa.Servlet;

import com.ppsa.bean.AreaBean;
import com.ppsa.bean.CargoBean;
import com.ppsa.bean.EmpleadoBean;
import com.ppsa.bean.FormatoBean;
import com.ppsa.bean.UsuarioBean;
import com.ppsa.common.Constantes;
import com.ppsa.common.Util;
import com.ppsa.logic.ConsultaLogic;
import com.ppsa.logic.MantenimientoLogic;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.lang.ObjectUtils;
import org.apache.log4j.Logger;
import org.json.JSONObject;

/**
 *
 * @author jaburtop
 */
@WebServlet(name = "ServletObtener", urlPatterns = {"/ServletObtener"})
public class ServletObtener extends HttpServlet {

    static final Logger m_log = Logger.getLogger(ServletObtener.class.getName());
    /**
     * Processes requests for both HTTP
     * <code>GET</code> and
     * <code>POST</code> methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest( HttpServletRequest request, HttpServletResponse response )
            throws ServletException, IOException {
        m_log.info("[processRequest] << ENTER");
        HttpSession objL_sesion = objL_sesion = request.getSession(true);
        try {
            UsuarioBean objL_usuarioBeanSession = new UsuarioBean();
            MantenimientoLogic objL_mantenimiento = null;
            ConsultaLogic objL_consulta = null;
            List<JSONObject> lstL_JSON = null;
            JSONObject objL_json = null;
            JSONObject objJSON_usuario = null;
            List<JSONObject> lst_empleadoToken = null;
            List<JSONObject> lst_preEmpleadoToken = null;
            JSONObject arrJson = null;
            EmpleadoBean objL_empleado = null;
            String strpv_codigoDocumento = null;
            String strpv_codigoVersion = null;
            String strpv_codigoReunion = null;
            String strpv_metodo = Util.getParameterString(request, "metodo", null, "");
            objL_usuarioBeanSession = (UsuarioBean) objL_sesion.getAttribute("objL_usuario");

            m_log.info("metodo := " + strpv_metodo);
            
            switch ( Util.obtenerEnumSwitch(strpv_metodo ) ) {
                case Constantes.METODO_OBTENER_CARGOS:
                    String strpv_codigoEmpresa = ObjectUtils.toString(request.getParameter("strpv_codigoEmpresa"));
                    List<AreaBean> lstL_areas = new ArrayList<AreaBean>();
                    objL_consulta = new ConsultaLogic();
                    lstL_areas = objL_consulta.listarArea(strpv_codigoEmpresa);
                    ArrayList<JSONObject> lst_JSONAreas = new ArrayList<JSONObject>();
                    for( AreaBean objArea : lstL_areas ) {
                        JSONObject objJSON_area = new JSONObject();
                        objJSON_area.put("codigo", objArea.getStrpv_codigoArea());
                        objJSON_area.put("nombre", objArea.getStrpv_nombreArea());
                        ArrayList<JSONObject> lst_JSONCargos = new ArrayList<JSONObject>();
                        for( CargoBean objCargo : objL_consulta.listarCargo(objArea.getStrpv_codigoArea()) ) {
                            JSONObject objJSON_cargo = new JSONObject();
                            objJSON_cargo.put("codigo", objCargo.getStrpv_codigoCargo());
                            objJSON_cargo.put("nombre", objCargo.getStrpv_nombreCargo());
                            lst_JSONCargos.add(objJSON_cargo);
                        }
                        objJSON_area.put("lstCargo", lst_JSONCargos);
                        lst_JSONAreas.add(objJSON_area);
                    }
                    Util.returnJSONWriter(response, lst_JSONAreas.toString());
                    break;
                case Constantes.METODO_tokenResponsable:
                    lst_empleadoToken = new ArrayList<JSONObject>();
                    lst_preEmpleadoToken = new ArrayList<JSONObject>();
                    arrJson = new JSONObject();
                    objL_consulta = new ConsultaLogic();

                    strpv_codigoDocumento = ObjectUtils.toString(request.getParameter("strpv_codigoDocumento"));
                    strpv_codigoVersion = ObjectUtils.toString(request.getParameter("strpv_codigoVersion"));
                    m_log.info("strpv_codigoDocumento->" + strpv_codigoDocumento);
                    m_log.info("strpv_codigoVersion  ->" + strpv_codigoVersion);

                    //se carga todos los empleados
                    for( EmpleadoBean oblTemp : objL_consulta.listarEmpleado() ) {
                        objL_json = new JSONObject();
                        objL_json.put("id", oblTemp.getStrpv_codigoEmpleado());
                        objL_json.put("strpv_nombreUsuario", oblTemp.getStrpv_nombreEmpleado());
                        lst_empleadoToken.add(objL_json);
                    }
                    //se carga todos los empleados ya grabados ( * solamente 1 )
                    objL_empleado = new EmpleadoBean();
                    objL_empleado = objL_consulta.obtenerEmpleadoResponsable(strpv_codigoDocumento, strpv_codigoVersion, Constantes.BUSQUEDA_TIPO_RESPONSABLE);

                    objL_json = new JSONObject();
                    objL_json.put("id", objL_empleado.getStrpv_codigoEmpleado());
                    objL_json.put("strpv_nombreUsuario", objL_empleado.getStrpv_nombreEmpleado());
                    lst_preEmpleadoToken.add(objL_json);

                    arrJson.put("lst_empleadoToken", lst_empleadoToken);
                    arrJson.put("lst_preEmpleadoToken", lst_preEmpleadoToken);
                    Util.returnJSONWriter(response, arrJson.toString());
                    break;
                case Constantes.METODO_tokenResponsableCopia:
                    lst_empleadoToken = new ArrayList<JSONObject>();
                    lst_preEmpleadoToken = new ArrayList<JSONObject>();
                    arrJson = new JSONObject();
                    objL_consulta = new ConsultaLogic();
                    
                    strpv_codigoDocumento = ObjectUtils.toString(request.getParameter("strpv_codigoDocumento"));
                    strpv_codigoVersion = ObjectUtils.toString(request.getParameter("strpv_codigoVersion"));
                    m_log.info("strpv_codigoDocumento->" + strpv_codigoDocumento);
                    m_log.info("strpv_codigoVersion  ->" + strpv_codigoVersion);

                    //se carga todos los empleados
                    for( EmpleadoBean oblTemp : objL_consulta.listarEmpleado() ) {
                        objL_json = new JSONObject();
                        objL_json.put("id", oblTemp.getStrpv_codigoEmpleado());
                        objL_json.put("strpv_nombreUsuario", oblTemp.getStrpv_nombreEmpleado());
                        lst_empleadoToken.add(objL_json);
                    }
                    //se carga todos los empleados ya grabados ( *N )
                    for( EmpleadoBean obj : objL_consulta.obtenerEmpleadoResponsableCopia(strpv_codigoDocumento, strpv_codigoVersion, Constantes.BUSQUEDA_TIPO_RESPONSABLE_COPIA) ) {
                        objL_json = new JSONObject();
                        objL_json.put("id", obj.getStrpv_codigoEmpleado());
                        objL_json.put("strpv_nombreUsuario", obj.getStrpv_nombreEmpleado());
                        lst_preEmpleadoToken.add(objL_json);
                    }

                    arrJson.put("lst_empleadoToken", lst_empleadoToken);
                    arrJson.put("lst_preEmpleadoToken", lst_preEmpleadoToken);
                    Util.returnJSONWriter(response, arrJson.toString());
                    break; 
                case Constantes.METODO_tokenReunion:
                    lst_empleadoToken = new ArrayList<JSONObject>();
                    lst_preEmpleadoToken = new ArrayList<JSONObject>();
                    arrJson = new JSONObject();
                    objL_consulta = new ConsultaLogic();

                    strpv_codigoReunion = ObjectUtils.toString(request.getParameter("strpv_codigoReunion"));
                    m_log.info("strpv_codigoReunion->" + strpv_codigoReunion);

                    //se carga todos los empleados
                    for( EmpleadoBean oblTemp : objL_consulta.listarEmpleado() ) {
                        objL_json = new JSONObject();
                        objL_json.put("id", oblTemp.getStrpv_codigoEmpleado());
                        objL_json.put("strpv_nombreUsuario", oblTemp.getStrpv_nombreEmpleado());
                        lst_empleadoToken.add(objL_json);
                    }
                    //se carga todos los empleados ya grabados ( * N )
                    if( strpv_codigoReunion.length() > 0 ){
                        for( EmpleadoBean obj : objL_consulta.obtenerListadoReunionEmpleado(strpv_codigoReunion) ) {
                            objL_json = new JSONObject();
                            objL_json.put("id", obj.getStrpv_codigoEmpleado());
                            objL_json.put("strpv_nombreUsuario", obj.getStrpv_nombreEmpleado());
                            lst_preEmpleadoToken.add(objL_json);
                        }
                    }
                    arrJson.put("lst_empleadoToken", lst_empleadoToken);
                    arrJson.put("lst_preEmpleadoToken", lst_preEmpleadoToken);
                    Util.returnJSONWriter(response, arrJson.toString());
                    break;
                case Constantes.METODO_tokenResponsableRevisar: 
                    lst_empleadoToken = new ArrayList<JSONObject>();
                    lst_preEmpleadoToken = new ArrayList<JSONObject>();
                    arrJson = new JSONObject();
                    objL_consulta = new ConsultaLogic();

                    strpv_codigoDocumento = ObjectUtils.toString(request.getParameter("strpv_codigoDocumento"));
                    strpv_codigoVersion = ObjectUtils.toString(request.getParameter("strpv_codigoVersion"));
                    m_log.info("strpv_codigoDocumento->" + strpv_codigoDocumento);
                    m_log.info("strpv_codigoVersion  ->" + strpv_codigoVersion);

                    //se carga todos los empleados
                    for( EmpleadoBean oblTemp : objL_consulta.listarEmpleadoxPerfil(Constantes.PERFIL_USUARIO_REVISAR) ) {
                        objL_json = new JSONObject();
                        objL_json.put("id", oblTemp.getStrpv_codigoEmpleado());
                        objL_json.put("strpv_nombreUsuario", oblTemp.getStrpv_nombreEmpleado());
                        lst_empleadoToken.add(objL_json);
                    }

                    //se carga todos los empleados ya grabados ( * N, ( RN 1 ) )
                    for( EmpleadoBean obj : objL_consulta.obtenerEmpleadoxDocumento(strpv_codigoDocumento, strpv_codigoVersion, Constantes.BUSQUEDA_TIPO_RESPONSABLE_REVISAR) ) {
                        objL_json = new JSONObject();
                        objL_json.put("id", obj.getStrpv_codigoEmpleado());
                        objL_json.put("strpv_nombreUsuario", obj.getStrpv_nombreEmpleado());
                        lst_preEmpleadoToken.add(objL_json);
                    }

                    arrJson.put("lst_empleadoToken", lst_empleadoToken);
                    arrJson.put("lst_preEmpleadoToken", lst_preEmpleadoToken);
                    Util.returnJSONWriter(response, arrJson.toString());                    
                    break;
                case Constantes.METODO_tokenResponsableAprobar:
                    lst_empleadoToken = new ArrayList<JSONObject>();
                    lst_preEmpleadoToken = new ArrayList<JSONObject>();
                    arrJson = new JSONObject();
                    objL_consulta = new ConsultaLogic();

                    strpv_codigoDocumento = ObjectUtils.toString(request.getParameter("strpv_codigoDocumento"));
                    strpv_codigoVersion = ObjectUtils.toString(request.getParameter("strpv_codigoVersion"));
                    m_log.info("strpv_codigoDocumento->" + strpv_codigoDocumento);
                    m_log.info("strpv_codigoVersion  ->" + strpv_codigoVersion);

                    //se carga todos los empleados
                    for( EmpleadoBean oblTemp : objL_consulta.listarEmpleadoxPerfil(Constantes.PERFIL_USUARIO_APROBAR) ) {
                        objL_json = new JSONObject();
                        objL_json.put("id", oblTemp.getStrpv_codigoEmpleado());
                        objL_json.put("strpv_nombreUsuario", oblTemp.getStrpv_nombreEmpleado());
                        lst_empleadoToken.add(objL_json);
                    }

                    //se carga todos los empleados ya grabados ( * N, ( RN 1 ) )
                    for( EmpleadoBean obj : objL_consulta.obtenerEmpleadoxDocumento(strpv_codigoDocumento, strpv_codigoVersion, Constantes.BUSQUEDA_TIPO_RESPONSABLE_APROBAR) ) {
                        objL_json = new JSONObject();
                        objL_json.put("id", obj.getStrpv_codigoEmpleado());
                        objL_json.put("strpv_nombreUsuario", obj.getStrpv_nombreEmpleado());
                        lst_preEmpleadoToken.add(objL_json);
                    }

                    arrJson.put("lst_empleadoToken", lst_empleadoToken);
                    arrJson.put("lst_preEmpleadoToken", lst_preEmpleadoToken);
                    Util.returnJSONWriter(response, arrJson.toString());                    
                    break;

                case Constantes.METODO_obtenerListadoParticipantes:

                    strpv_codigoReunion = ObjectUtils.toString(request.getParameter("strpv_codigoReunion"));
                    m_log.info("strpv_codigoReunion ->" + strpv_codigoReunion);
                    lstL_JSON = new ArrayList<JSONObject>();
                    objL_consulta = new ConsultaLogic();
                    
                    for( EmpleadoBean obj : objL_consulta.obtenerListadoReunionEmpleado(strpv_codigoReunion) ) {
                        objL_json = new JSONObject();
                        objL_json.put("strpv_codigoEmpleado", obj.getStrpv_codigoEmpleado());
                        objL_json.put("strpv_nombreEmpleado", obj.getStrpv_nombreEmpleado());
                        objL_json.put("strpv_estadoAsistencia", obj.getStrpv_estadoAsistencia());
                        objL_json.put("setStrpv_estadoEdicionAsistencia", obj.getStrpv_estadoEdicionAsistencia());
                        objL_json.put("strpv_fechaAsistencia", obj.getStrpv_fechaAsistencia());
                        lstL_JSON.add(objL_json);
                    }
                    Util.returnJSONWriter(response, lstL_JSON.toString());
                    break;
                case Constantes.METODO_obtenerUsuarioDocuLeido: 
                    strpv_codigoDocumento = ObjectUtils.toString(request.getParameter("strpv_codigoDocumento"));
                    strpv_codigoVersion = ObjectUtils.toString(request.getParameter("strpv_codigoVersion"));
                    ArrayList<JSONObject> lstL_jsonDocuLeido = new ArrayList<JSONObject>();
                    ArrayList<JSONObject> lstL_jsonDocuNoLeido = new ArrayList<JSONObject>();
                    JSONObject json_usuarioLeido  = new JSONObject();
                    objL_consulta = new ConsultaLogic();
                    m_log.info("strpv_codigoDocumento ->" + strpv_codigoDocumento);
                    m_log.info("strpv_codigoVersion   ->" + strpv_codigoVersion);
                    for( EmpleadoBean obj : objL_consulta.obtenerUsuarioDocuLeido(strpv_codigoDocumento, strpv_codigoVersion) ) {
                        objL_json = new JSONObject();
                        objL_json.put("strpv_codigoEmpleado", obj.getStrpv_codigoEmpleado());
                        objL_json.put("strpv_nombreEmpleado", obj.getStrpv_nombreEmpleado());
                        objL_json.put("strpv_fechaLectura", " 12/03/2013 16:45 pm ");
                        //objL_json.put("strpv_estadoAsistencia",obj.getStrpv_estadoAsistencia());
                        //objL_json.put("strpv_fechaAsistencia",obj.getStrpv_fechaAsistencia());
                        lstL_jsonDocuLeido.add(objL_json);
                    }

                    for( EmpleadoBean obj : objL_consulta.obtenerUsuarioDocuNoLeido(strpv_codigoDocumento, strpv_codigoVersion) ) {
                        objL_json = new JSONObject();
                        objL_json.put("strpv_codigoEmpleado", obj.getStrpv_codigoEmpleado());
                        objL_json.put("strpv_nombreEmpleado", obj.getStrpv_nombreEmpleado());
                        objL_json.put("strpv_fechaLectura", " 12/03/2013 16:45 pm ");
                        //objL_json.put("strpv_estadoAsistencia",obj.getStrpv_estadoAsistencia());
                        //objL_json.put("strpv_fechaAsistencia",obj.getStrpv_fechaAsistencia());
                        lstL_jsonDocuNoLeido.add(objL_json);
                    }

                    json_usuarioLeido.put("lst_usuarioLeido",lstL_jsonDocuLeido);
                    json_usuarioLeido.put("lst_usuarioNoLeido",lstL_jsonDocuNoLeido);
                    Util.returnJSONWriter(response, json_usuarioLeido.toString());
                    break;              
                case Constantes.METODO_obtenerResponsableCopia: {
                    strpv_codigoDocumento = ObjectUtils.toString(request.getParameter("strpv_codigoDocumento"));
                    System.out.println("strpv_codigoDocumento -->" + strpv_codigoDocumento + "|");
                    strpv_codigoVersion = "1";//ObjectUtils.toString(request.getParameter("strpv_codigoVersion"));
                    objL_consulta = new ConsultaLogic();
                    
                    List<JSONObject> lst_json = new ArrayList<JSONObject>();
                    for( EmpleadoBean obj : objL_consulta.obtenerEmpleadoResponsableCopia(strpv_codigoDocumento, strpv_codigoVersion, Constantes.BUSQUEDA_TIPO_RESPONSABLE_COPIA) ) {
                        objJSON_usuario = new JSONObject();
                        objJSON_usuario.put("strpv_codigoUsuario", obj.getStrpv_codigoEmpleado());
                        objJSON_usuario.put("strpv_nombreUsuario", obj.getStrpv_nombreEmpleado());
                        lst_json.add(objJSON_usuario);
                    }
                    Util.returnJSONWriter(response, lst_json.toString());
                    break;
                }
                case Constantes.METODO_obtenerFormatoDocumento:
                    strpv_codigoDocumento = ObjectUtils.toString(request.getParameter("strpv_codigoDocumento"));
                    strpv_codigoVersion = ObjectUtils.toString(request.getParameter("strpv_codigoVersion"));
                    objL_consulta = new ConsultaLogic();
                    List<JSONObject> lst_json = new ArrayList<JSONObject>();
                    for( FormatoBean obj : objL_consulta.obtenerListadoFormato( strpv_codigoDocumento, strpv_codigoVersion ) ) {
                        System.out.println( "************************" );
                        objL_json = new JSONObject();

                        objL_json.put( "strpv_codigoArchivo", obj.getStrpv_codigoArchivo().trim() );
                        objL_json.put( "strpv_codigoFormato", obj.getStrpv_codigoFormato().trim() );
                        objL_json.put( "strpv_codigoRefFormato", obj.getStrpv_codigoRefFormato().trim() );
                        objL_json.put( "strpv_versionFormato", String.format("%03d",  Integer.parseInt(obj.getStrpv_versionFormato()) ));
                        objL_json.put( "strpv_nombreFormato", obj.getStrpv_nombreFormato().trim() );
                        objL_json.put( "strpv_estadoFormato", obj.getStrpv_estadoFormato().trim() );
                        objL_json.put( "strpv_extension",  obj.getStrpv_extension().trim() );
                        objL_json.put( "strpv_imgExtension",  Util.obtenerImagenxExtension( obj.getStrpv_extension().trim() ) );
                        objL_json.put( "strpv_codigoDocumento", obj.getStrpv_codigoDocumento().trim() );
                        objL_json.put( "strpv_codigoVersionDocumento", obj.getStrpv_codigoVersionDocumento().trim() );

                        lst_json.add( objL_json );
                    }
                    Util.returnJSONWriter(response, lst_json.toString());
                    break;
            }

            m_log.info("[processRequest] >> EXIT");
        } catch ( Exception e ) {
            e.printStackTrace();
        } finally {
            //out.close();
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet( HttpServletRequest request, HttpServletResponse response )
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost( HttpServletRequest request, HttpServletResponse response )
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
